public class LeetCode387 {
    /**
     * 找到字符串中第一个不重复的字符，并返回它的索引。
     * 如果没有不重复的字符，返回 -1。
     *
     * @param s 输入字符串
     * @return 第一个不重复字符的索引，如果没有则返回 -1
     */
    public int firstUniqChar(String s) {
        // 创建一个长度为26的整型数组 arr，用于记录'a'到'z'每个字母在字符串中出现的次数。
        int[] arr = new int[26];

        // 将输入字符串转换为字符数组，以便于遍历。
        char[] chars = s.toCharArray();

        // 遍历字符数组，统计每个字符（假设都是小写字母）出现的次数。
        for (char ch : chars) {
            // 'a' 的 ASCII 码是 97，因此这里通过 ch - 'a' 来获取字符相对于 'a' 的位置，
            // 这样可以将字符映射到数组 arr 的索引0到25之间。
            arr[ch - 'a']++;
        }

        // 再次遍历字符数组，这次是为了寻找第一个出现次数为1的字符。
        for (int i = 0; i < chars.length; i++) {
            // 获取当前索引处的字符。
            char ch = chars[i];

            // 检查该字符在 arr 数组中的计数是否为1，即只出现了一次。
            if (arr[ch - 'a'] == 1) {
                // 如果找到了，立即返回这个字符的原始索引。
                return i;
            }
        }

        // 如果遍历结束后没有找到任何只出现一次的字符，返回 -1 表示没有这样的字符。
        return -1;
    }
}
